Micron Document
πŸŽ–οΈGitΠ―Ρ€Π°πŸŽ–οΈ


Displaying Rendered β€’ View raw β€’ Download

core/repository/README.md 988db081b289cbc23d9bceef8e7d85ab46d0e6a4 (988db081) Text, 8.47 KB

T383838:core:repository

Overview

The T383838:core:repository module defines the data and infrastructure contracts for the Meshtastic KMP architecture. It is almost entirely interfaces β€” concrete implementations live in T383838:core:service and platform modules. Consumers receive T383838:core:model and T383838:core:proto transitively because both are T383838api()-exported.

Targets: Android Β· JVM Β· iOS (via T383838meshtastic.kmp.library convention plugin)

Key Responsibilities

β€’ Define the reactive data contracts between the long-running mesh service and all feature/UI layers
β€’ Declare the raw hardware I/O interface (T383838RadioTransport)
β€’ Provide the mesh node database interface (T383838NodeRepository)
β€’ Expose per-node remote-admin passkey management (T383838SessionManager)
β€’ Host all packet handlers (admin, telemetry, traceroute, store-and-forward, neighbour info)
β€’ Manage the outbound message queue, MQTT bridge, and XModem firmware transfer
β€’ Provide the T383838AppWidgetUpdater contract so the mesh service can trigger widget refreshes without depending on Android widget APIs directly

Source Structure

T282828
src/
β”œβ”€β”€ commonMain/kotlin/org/meshtastic/core/repository/
β”‚ β”œβ”€β”€ RadioTransport.kt ← interface: raw hardware I/O
β”‚ β”œβ”€β”€ ServiceRepository.kt ← interface: service ↔ UI bridge (extends all providers)
β”‚ β”œβ”€β”€ ConnectionStateProvider.kt ← interface: read-only connection state
β”‚ β”œβ”€β”€ ResponseProviders.kt ← interfaces: TracerouteResponseProvider, NeighborInfoResponseProvider
β”‚ β”œβ”€β”€ ServiceStateWriter.kt ← interface: write-side for handlers
β”‚ β”œβ”€β”€ NodeRepository.kt ← interface: mesh node database
β”‚ β”œβ”€β”€ SessionManager.kt ← interface: per-node passkey store
β”‚ β”œβ”€β”€ MeshConnectionManager.kt ← interface: connection lifecycle callbacks
β”‚ β”œβ”€β”€ AppWidgetUpdater.kt ← interface: trigger widget refresh
β”‚ β”œβ”€β”€ LocationRepository.kt
β”‚ β”œβ”€β”€ LocationService.kt
β”‚ β”œβ”€β”€ RadioController.kt ← interface: composite radio command API
β”‚ β”œβ”€β”€ AdminController.kt ← config, channels, owner, device lifecycle, editSettings
β”‚ β”œβ”€β”€ MessagingController.kt ← send packets, reactions, contacts
β”‚ β”œβ”€β”€ NodeController.kt ← favorite, ignore, mute, remove nodes
β”‚ β”œβ”€β”€ QueryController.kt ← telemetry, traceroute, position queries
β”‚ β”œβ”€β”€ CommandSender.kt
β”‚ β”œβ”€β”€ AdminPacketHandler.kt
β”‚ β”œβ”€β”€ FromRadioPacketHandler.kt
β”‚ β”œβ”€β”€ MeshConfigFlowManager.kt
β”‚ β”œβ”€β”€ MeshConfigHandler.kt
β”‚ β”œβ”€β”€ MeshDataHandler.kt
β”‚ β”œβ”€β”€ MeshLocationManager.kt
β”‚ β”œβ”€β”€ MeshLogRepository.kt
β”‚ β”œβ”€β”€ MeshMessageProcessor.kt
β”‚ β”œβ”€β”€ MessageFilter.kt
β”‚ β”œβ”€β”€ MessageQueue.kt
β”‚ β”œβ”€β”€ MqttManager.kt
β”‚ β”œβ”€β”€ NeighborInfoHandler.kt
β”‚ β”œβ”€β”€ NodeManager.kt
β”‚ β”œβ”€β”€ Notification.kt / NotificationManager.kt
β”‚ β”œβ”€β”€ PacketHandler.kt / PacketRepository.kt
β”‚ β”œβ”€β”€ QuickChatActionRepository.kt
β”‚ β”œβ”€β”€ RadioConfigRepository.kt
β”‚ β”œβ”€β”€ RadioInterfaceService.kt
β”‚ β”œβ”€β”€ RadioTransportCallback.kt / RadioTransportFactory.kt
β”‚ β”œβ”€β”€ StoreForwardPacketHandler.kt
β”‚ β”œβ”€β”€ TelemetryPacketHandler.kt
β”‚ β”œβ”€β”€ TracerouteHandler.kt / TracerouteSnapshotRepository.kt
β”‚ β”œβ”€β”€ XModemFile.kt / XModemManager.kt
β”‚ β”œβ”€β”€ usecase/
β”‚ β”‚ └── SendMessageUseCase.kt
β”‚ └── di/
β”‚ └── CoreRepositoryModule.kt
β”œβ”€β”€ androidMain/kotlin/ ← Android LocationRepository actual
β”œβ”€β”€ iosMain/kotlin/ ← iOS LocationRepository actual
└── jvmMain/kotlin/ ← Desktop LocationRepository actual

Core Interfaces

T383838RadioTransport

Raw hardware I/O contract for all physical transports (BLE, USB, TCP, Mock).

T282828
Tff7b72interface T56d364RadioTransport Tb4b4b4{
Tff7b72fun Td2a8ffhandleSendToRadioTb4b4b4(Te6edf3pTb4b4b4: Te6edf3ByteArrayTb4b4b4)
Tff7b72fun Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72fun Td2a8ffkeepAliveTb4b4b4(Tb4b4b4)
Tff7b72suspend Tff7b72fun Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tb4b4b4}


T383838ServiceRepository

The primary reactive bridge between the long-running mesh service and all feature/UI layers.
Decomposed into focused sub-interfaces via Interface Segregation Principle:

T282828
Tff7b72interface T56d364ConnectionStateProvider Tb4b4b4{
Tff7b72val Te6edf3connectionStateTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ConnectionStateTff7b72>
Tb4b4b4}

Tff7b72interface T56d364TracerouteResponseProvider Tb4b4b4{
Tff7b72val Te6edf3tracerouteResponseTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3TracerouteResponse?Tff7b72>
Tff7b72fun Td2a8ffclearTracerouteResponseTb4b4b4(Tb4b4b4)
Tb4b4b4}

Tff7b72interface T56d364NeighborInfoResponseProvider Tb4b4b4{
Tff7b72val Te6edf3neighborInfoResponseTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657String?Tff7b72>
Tff7b72fun Td2a8ffclearNeighborInfoResponseTb4b4b4(Tb4b4b4)
Tb4b4b4}

Tff7b72interface T56d364ServiceStateWriter Tb4b4b4{
Tff7b72fun Td2a8ffsetConnectionStateTb4b4b4(Te6edf3stateTb4b4b4: Te6edf3ConnectionStateTb4b4b4)
Tff7b72suspend Tff7b72fun Td2a8ffemitMeshPacketTb4b4b4(Te6edf3packetTb4b4b4: Te6edf3MeshPacketTb4b4b4)
Tff7b72fun Td2a8ffsetTracerouteResponseTb4b4b4(Te6edf3valueTb4b4b4: Te6edf3TracerouteResponse?Tb4b4b4)
Tff7b72fun Td2a8ffsetNeighborInfoResponseTb4b4b4(Te6edf3valueTb4b4b4: Tffa657String?Tb4b4b4)
T8b949e// …setters/clearers for error, progress, notification
Tb4b4b4}

Tff7b72interface T56d364ServiceRepository Tb4b4b4:
Te6edf3ConnectionStateProviderTb4b4b4,
Te6edf3TracerouteResponseProviderTb4b4b4,
Te6edf3NeighborInfoResponseProviderTb4b4b4,
Te6edf3ServiceStateWriter Tb4b4b4{
Tff7b72val Te6edf3clientNotificationTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ClientNotification?Tff7b72>
Tff7b72val Te6edf3errorMessageTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657String?Tff7b72>
Tff7b72val Te6edf3connectionProgressTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657String?Tff7b72>
Tff7b72val Te6edf3meshPacketFlowTb4b4b4: Te6edf3FlowTff7b72<Te6edf3MeshPacketTff7b72>
Tb4b4b4}


VMs inject the narrowest interface they need (e.g., T383838ConnectionStateProvider for read-only
connection state). Handlers inject T383838ServiceStateWriter for mutations. The full
T383838ServiceRepository union is still available for backward compatibility.

Radio commands are issued through T383838RadioController (a composite of T383838AdminController,
T383838MessagingController, T383838NodeController, T383838QueryController) rather than an action/intent bus.

T383838NodeRepository

Reactive mesh node database. Backed by Room KMP in T383838:core:service.

T282828
Tff7b72interface T56d364NodeRepository Tb4b4b4{
Tff7b72val Te6edf3myNodeInfoTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3MyNodeInfo?Tff7b72>
Tff7b72val Te6edf3ourNodeInfoTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3Node?Tff7b72>
Tff7b72val Te6edf3myIdTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657String?Tff7b72>
Tff7b72val Te6edf3localStatsTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3LocalStatsTff7b72>
Tff7b72val Te6edf3nodeDBbyNumTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3MapTff7b72<Tffa657IntTb4b4b4, Te6edf3NodeTff7b72>Tff7b72>
Tff7b72val Te6edf3onlineNodeCountTb4b4b4: Te6edf3FlowTff7b72<Tffa657IntTff7b72>
Tff7b72val Te6edf3totalNodeCountTb4b4b4: Te6edf3FlowTff7b72<Tffa657IntTff7b72>

Tff7b72fun Td2a8ffgetNodesTb4b4b4(Te6edf3sortTb4b4b4, Te6edf3filterTb4b4b4, Te6edf3includeUnknownTb4b4b4, Te6edf3onlyOnlineTb4b4b4, Te6edf3onlyDirectTb4b4b4)Tb4b4b4: Te6edf3FlowTff7b72<Te6edf3ListTff7b72<Te6edf3NodeTff7b72>Tff7b72>
Tff7b72suspend Tff7b72fun Td2a8ffupsertTb4b4b4(Te6edf3nodeTb4b4b4: Te6edf3NodeTb4b4b4)
Tff7b72suspend Tff7b72fun Td2a8ffclearNodeDBTb4b4b4(Te6edf3preserveFavoritesTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4)
Tff7b72suspend Tff7b72fun Td2a8ffdeleteNodeTb4b4b4(Te6edf3numTb4b4b4: Tffa657IntTb4b4b4)
Tff7b72suspend Tff7b72fun Td2a8ffinsertMetadataTb4b4b4(Te6edf3nodeNumTb4b4b4: Tffa657IntTb4b4b4, Te6edf3metadataTb4b4b4: Te6edf3DeviceMetadataTb4b4b4)
Tff7b72suspend Tff7b72fun Td2a8ffinstallConfigTb4b4b4(Te6edf3miTb4b4b4: Te6edf3MyNodeInfoTb4b4b4, Te6edf3nodesTb4b4b4: Te6edf3ListTff7b72<Te6edf3NodeTff7b72>Tb4b4b4)
Tb4b4b4}


T383838SessionManager

Per-node remote-admin passkey store, consumed by T383838:core:domain's T383838EnsureRemoteAdminSessionUseCase.

T282828
Tff7b72interface T56d364SessionManager Tb4b4b4{
Tff7b72fun Td2a8ffrecordSessionTb4b4b4(Te6edf3srcNodeNumTb4b4b4: Tffa657IntTb4b4b4, Te6edf3passkeyTb4b4b4: Te6edf3ByteStringTb4b4b4)
Tff7b72fun Td2a8ffgetPasskeyTb4b4b4(Te6edf3destNumTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Te6edf3ByteString
Tff7b72fun Td2a8ffclearAllTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3sessionRefreshFlowTb4b4b4: Te6edf3FlowTff7b72<Tffa657IntTff7b72>
Tff7b72fun Td2a8ffobserveSessionStatusTb4b4b4(Te6edf3destNumTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Te6edf3FlowTff7b72<Te6edf3SessionStatusTff7b72>
Tb4b4b4}


Dependency Graph

T282828
core:repository
β”œβ”€β”€ api β†’ core:model (exported to consumers)
β”œβ”€β”€ api β†’ core:proto (exported to consumers)
β”œβ”€β”€ core:common
β”œβ”€β”€ core:database
└── kotlinx.coroutines, kermit, androidx.paging.common

Dependency Graph

<!--region graph-->
T282828
Te6edf3graph Te6edf3TB
:Te6edf3coreTb4b4b4:Te6edf3repositoryTff7b72[Te6edf3repositoryTff7b72]Tff7b72:::Te6edf3kmpTff7b72-Te6edf3library
:Te6edf3coreTb4b4b4:Te6edf3repository T8b949e--> :core:model
:Te6edf3coreTb4b4b4:Te6edf3repository Tff7b72-Tb4b4b4.Tff7b72-Tff7b72> :Te6edf3coreTb4b4b4:Te6edf3common
:Te6edf3coreTb4b4b4:Te6edf3repository Tff7b72-Tb4b4b4.Tff7b72-Tff7b72> :Te6edf3coreTb4b4b4:Tff7b72database
:Te6edf3coreTb4b4b4:Te6edf3repository Tff7b72-Tb4b4b4.Tff7b72-Tff7b72> :Te6edf3coreTb4b4b4:Te6edf3testing

Te6edf3classDef Te6edf3androidTff7b72-Te6edf3application Te6edf3fillTb4b4b4:Te6edf3#CAFFBFTb4b4b4,Te6edf3strokeTb4b4b4:Te6edf3#000Tb4b4b4,Te6edf3strokeTff7b72-Te6edf3widthTb4b4b4:T79c0ff2Te6edf3pxTb4b4b4,Te6edf3colorTb4b4b4:Te6edf3#000Tb4b4b4;
Te6edf3classDef Te6edf3androidTff7b72-Te6edf3applicationTff7b72-Te6edf3compose Te6edf3fillTb4b4b4:Te6edf3#CAFFBFTb4b4b4,Te6edf3strokeTb4b4b4:Te6edf3#000Tb4b4b4,Te6edf3strokeTff7b72-Te6edf3widthTb4b4b4:T79c0ff2Te6edf3pxTb4b4b4,Te6edf3colorTb4b4b4:Te6edf3#000Tb4b4b4;
Te6edf3classDef Te6edf3composeTff7b72-Te6edf3desktopTff7b72-Te6edf3application Te6edf3fillTb4b4b4:Te6edf3#CAFFBFTb4b4b4,Te6edf3strokeTb4b4b4:Te6edf3#000Tb4b4b4,Te6edf3strokeTff7b72-Te6edf3widthTb4b4b4:T79c0ff2Te6edf3pxTb4b4b4,Te6edf3colorTb4b4b4:Te6edf3#000Tb4b4b4;
Te6edf3classDef Te6edf3androidTff7b72-Te6edf3feature Te6edf3fillTb4b4b4:Te6edf3#FFD6A5Tb4b4b4,Te6edf3strokeTb4b4b4:Te6edf3#000Tb4b4b4,Te6edf3strokeTff7b72-Te6edf3widthTb4b4b4:T79c0ff2Te6edf3pxTb4b4b4,Te6edf3colorTb4b4b4:Te6edf3#000Tb4b4b4;
Te6edf3classDef Te6edf3androidTff7b72-Te6edf3library Te6edf3fillTb4b4b4:Te6edf3#9BF6FFTb4b4b4,Te6edf3strokeTb4b4b4:Te6edf3#000Tb4b4b4,Te6edf3strokeTff7b72-Te6edf3widthTb4b4b4:T79c0ff2Te6edf3pxTb4b4b4,Te6edf3colorTb4b4b4:Te6edf3#000Tb4b4b4;
Te6edf3classDef Te6edf3androidTff7b72-Te6edf3libraryTff7b72-Te6edf3compose Te6edf3fillTb4b4b4:Te6edf3#9BF6FFTb4b4b4,Te6edf3strokeTb4b4b4:Te6edf3#000Tb4b4b4,Te6edf3strokeTff7b72-Te6edf3widthTb4b4b4:T79c0ff2Te6edf3pxTb4b4b4,Te6edf3colorTb4b4b4:Te6edf3#000Tb4b4b4;
Te6edf3classDef Te6edf3androidTff7b72-Te6edf3test Te6edf3fillTb4b4b4:Te6edf3#A0C4FFTb4b4b4,Te6edf3strokeTb4b4b4:Te6edf3#000Tb4b4b4,Te6edf3strokeTff7b72-Te6edf3widthTb4b4b4:T79c0ff2Te6edf3pxTb4b4b4,Te6edf3colorTb4b4b4:Te6edf3#000Tb4b4b4;
Te6edf3classDef Te6edf3jvmTff7b72-Te6edf3library Te6edf3fillTb4b4b4:Te6edf3#BDB2FFTb4b4b4,Te6edf3strokeTb4b4b4:Te6edf3#000Tb4b4b4,Te6edf3strokeTff7b72-Te6edf3widthTb4b4b4:T79c0ff2Te6edf3pxTb4b4b4,Te6edf3colorTb4b4b4:Te6edf3#000Tb4b4b4;
Te6edf3classDef Te6edf3kmpTff7b72-Te6edf3feature Te6edf3fillTb4b4b4:Te6edf3#FFD6A5Tb4b4b4,Te6edf3strokeTb4b4b4:Te6edf3#000Tb4b4b4,Te6edf3strokeTff7b72-Te6edf3widthTb4b4b4:T79c0ff2Te6edf3pxTb4b4b4,Te6edf3colorTb4b4b4:Te6edf3#000Tb4b4b4;
Te6edf3classDef Te6edf3kmpTff7b72-Te6edf3libraryTff7b72-Te6edf3compose Te6edf3fillTb4b4b4:Te6edf3#FFC1CCTb4b4b4,Te6edf3strokeTb4b4b4:Te6edf3#000Tb4b4b4,Te6edf3strokeTff7b72-Te6edf3widthTb4b4b4:T79c0ff2Te6edf3pxTb4b4b4,Te6edf3colorTb4b4b4:Te6edf3#000Tb4b4b4;
Te6edf3classDef Te6edf3kmpTff7b72-Te6edf3library Te6edf3fillTb4b4b4:Te6edf3#FFC1CCTb4b4b4,Te6edf3strokeTb4b4b4:Te6edf3#000Tb4b4b4,Te6edf3strokeTff7b72-Te6edf3widthTb4b4b4:T79c0ff2Te6edf3pxTb4b4b4,Te6edf3colorTb4b4b4:Te6edf3#000Tb4b4b4;
Te6edf3classDef Tff7b72unknown Te6edf3fillTb4b4b4:Te6edf3#FFADADTb4b4b4,Te6edf3strokeTb4b4b4:Te6edf3#000Tb4b4b4,Te6edf3strokeTff7b72-Te6edf3widthTb4b4b4:T79c0ff2Te6edf3pxTb4b4b4,Te6edf3colorTb4b4b4:Te6edf3#000Tb4b4b4;


<!--endregion-->

Served by rngit 1.5.0 - Generated in 0.07s